package net.certiv.antlr.project.base;
import java.io.StringWriter;
import java.lang.reflect.Type;
import java.text.DateFormat;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import com.google.gson.LongSerializationPolicy;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonWriter;
public class GsonGen {
private GsonBuilder builder;
private Gson gson;
private String indent = " ";
private JsonWriter jwriter;
private StringWriter writer;
public GsonGen() {
super();
this.builder = new GsonBuilder();
}
/**
* Configures builder for pretty printing with 4-space tabstops
*/
public void configDefaultBuilder() {
configBasicBuilder();
this.builder.setPrettyPrinting();
setIndent(" ");
}
/**
* Configures compact builder with 2-space tabstops
*/
public void configBasicBuilder() {
this.builder.enableComplexMapKeySerialization()
.disableHtmlEscaping()
.serializeNulls()
.setDateFormat(DateFormat.LONG)
.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
.setVersion(1.0);
setIndent(indent);
}
// ------------------------------------------------------------------------------
// Gson delegates ---------------------------------------------------------------
public void create() {
this.gson = builder.create();
if (this.jwriter == null) createJsonWriter();
}
public String toJson(Object src) {
if (gson == null) create();
gson.toJson(src, src.getClass(), jwriter);
return writer.toString();
}
public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {
return gson.fromJson(json, classOfT);
}
public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
return gson.getAdapter(type);
}
public <T> TypeAdapter<T> getDelegateAdapter(TypeAdapterFactory skipPast, TypeToken<T> type) {
return gson.getDelegateAdapter(skipPast, type);
}
public <T> TypeAdapter<T> getAdapter(Class<T> type) {
return gson.getAdapter(type);
}
// ------------------------------------------------------------------------------
// JsonWriter delegates ---------------------------------------------------------
public String getIndent() {
return this.indent;
}
public void setIndent(String indent) {
this.indent = indent;
createJsonWriter();
this.jwriter.setIndent(indent);
}
private void createJsonWriter() {
if (this.jwriter == null) {
this.writer = new StringWriter();
this.jwriter = new JsonWriter(writer);
}
}
// ------------------------------------------------------------------------------
// Builder delegates ------------------------------------------------------------
public GsonGen setVersion(double ignoreVersionsAfter) {
builder.setVersion(ignoreVersionsAfter);
return this;
}
public GsonGen excludeFieldsWithModifiers(int... modifiers) {
builder.excludeFieldsWithModifiers(modifiers);
return this;
}
public GsonGen generateNonExecutableJson() {
builder.generateNonExecutableJson();
return this;
}
public GsonGen excludeFieldsWithoutExposeAnnotation() {
builder.excludeFieldsWithoutExposeAnnotation();
return this;
}
public GsonGen serializeNulls() {
builder.serializeNulls();
return this;
}
public GsonGen enableComplexMapKeySerialization() {
builder.enableComplexMapKeySerialization();
return this;
}
public GsonGen disableInnerClassSerialization() {
builder.disableInnerClassSerialization();
return this;
}
public GsonGen setLongSerializationPolicy(LongSerializationPolicy serializationPolicy) {
builder.setLongSerializationPolicy(serializationPolicy);
return this;
}
public GsonGen setFieldNamingPolicy(FieldNamingPolicy namingConvention) {
builder.setFieldNamingPolicy(namingConvention);
return this;
}
public GsonGen setFieldNamingStrategy(FieldNamingStrategy fieldNamingStrategy) {
builder.setFieldNamingStrategy(fieldNamingStrategy);
return this;
}
public GsonGen setExclusionStrategies(ExclusionStrategy... strategies) {
builder.setExclusionStrategies(strategies);
return this;
}
public GsonGen addSerializationExclusionStrategy(ExclusionStrategy strategy) {
builder.addSerializationExclusionStrategy(strategy);
return this;
}
public GsonGen addDeserializationExclusionStrategy(ExclusionStrategy strategy) {
builder.addDeserializationExclusionStrategy(strategy);
return this;
}
public GsonGen setPrettyPrinting() {
builder.setPrettyPrinting();
return this;
}
public GsonGen disableHtmlEscaping() {
builder.disableHtmlEscaping();
return this;
}
public GsonGen setDateFormat(String pattern) {
builder.setDateFormat(pattern);
return this;
}
public GsonGen setDateFormat(int style) {
builder.setDateFormat(style);
return this;
}
public GsonGen setDateFormat(int dateStyle, int timeStyle) {
builder.setDateFormat(dateStyle, timeStyle);
return this;
}
public GsonGen registerTypeAdapter(Type type, Object typeAdapter) {
builder.registerTypeAdapter(type, typeAdapter);
return this;
}
public GsonGen registerTypeAdapterFactory(TypeAdapterFactory factory) {
builder.registerTypeAdapterFactory(factory);
return this;
}
public GsonGen registerTypeHierarchyAdapter(Class<?> baseType, Object typeAdapter) {
builder.registerTypeHierarchyAdapter(baseType, typeAdapter);
return this;
}
public GsonGen serializeSpecialFloatingPointValues() {
builder.serializeSpecialFloatingPointValues();
return this;
}
public String toString() {
return builder.toString();
}
}